﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://coflys.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 官方网站：https://kit.coflys.com
//
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
//
// 更多信息
// 请访问 https://gitee.com/dotnetchina/Furion 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

using Neto.Db.AbcSqlSugar;
using Furion.Localization;
using Microsoft.Extensions.Localization;
using NPOI.SS.Formula.Functions;
using System.Globalization;

namespace Neto.Core.CoreServices;

/// <summary>
/// 实现本地化数据接口
/// </summary>
public class AbcLocalizationData : IAbcLocalizationData, ITransient
{
    /// <summary>
    /// 加载本地翻译到缓存
    /// </summary>
    /// <returns></returns>
    public void LoadData()
    {
        try
        {
            //查询出 全球化或本地化及翻译
            var queryable = SqlSugarHelper.Db.Queryable<SysLocalizationTranslation>()
                .LeftJoin<SysLocalization>((lt, l) => lt.LocalizationId == l.Id);
            // //路由区域
            // if (!string.IsNullOrWhiteSpace(area)) queryable = queryable.Where((lt, l) => lt.Area == area);
            // //语种区域码
            // if (!string.IsNullOrWhiteSpace(culture)) queryable = queryable.Where((lt, l) => lt.Culture == culture);

            var localizationTranslations = queryable
                .Select((lt, l) => new { lt.Area, l.Title, lt.Culture, lt.Translation })
                .ToList();

            //区域代码集合
            var cultures = localizationTranslations.Select(o => o.Culture).Distinct().ToList();
            //区域
            var areas = localizationTranslations.Select(o => o.Area).Distinct().ToList();

            //遍历路由区域
            foreach (var areaItem in areas)
            //遍历语种
            foreach (var cultureItem in cultures)
            {
                var dic = localizationTranslations
                    .Where(o => o.Area == areaItem && o.Culture == cultureItem)
                    .ToDictionary(o => o.Title, v => v.Translation);
                //设置到缓存
                LEx.LocalizationAddOrUpdate(areaItem, cultureItem, dic);
            }
        }
        catch (Exception ex)
        {
            AbcLog.Error(ex.ToStringEx(), "Neto\\全球化和本地化\\本地化数据");
        }
    }

    /// <summary>
    /// 翻译
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public string Translate(string name)
    {
        //var culture = CultureInfo.CurrentCulture.Name;
        var culture = L.GetSelectCulture().Culture.Name;
        var areaName = App.HttpContext.GetAreaName();

        var txt= LEx.Text(name, areaName, culture);
        return txt;
    }

    /// <summary>
    /// 翻译
    /// </summary>
    /// <param name="name"></param>
    /// <param name="arguments">参数</param>
    /// <returns></returns>
    public string Translate(string name, params object[] arguments)
    {
        var culture = L.GetSelectCulture().Culture.Name;
        var areaName = App.HttpContext.GetAreaName();

       var txt= LEx.Text(name, areaName, culture, arguments);

       return txt;
    }

    /// <summary>
    /// 设置缓存
    /// </summary>
    /// <param name="area"></param>
    /// <param name="culture"></param>
    /// <param name="dic"></param>
    public void SetCache(string area, string culture, Dictionary<string, string> dic)
    {
        var cacheKey= LEx.GetCacheKey(area, culture);
        // 使用字典添加或更新方法，如果键已存在，则用新的字典替换旧的。
        LEx.LocalizationDics.AbcAddOrUpdate(cacheKey, dic);
    }
    /// <summary>
    /// 读取缓存
    /// </summary>
    /// <param name="area"></param>
    /// <param name="culture"></param>
    /// <returns></returns>
    public Dictionary<string, string> GetCache(string area, string culture)
    {
        //如果为空，直接返回
        if (string.IsNullOrWhiteSpace(culture)) return new Dictionary<string, string>();
        
        var cacheKey= LEx.GetCacheKey(area, culture);

        var isGetDic = LEx.LocalizationDics.TryGetValue(cacheKey, out var dic);
        
        if (!isGetDic) dic = new Dictionary<string, string>();
      
        return dic;
    }


    /// <summary>
    /// 获取具有给定名称并使用提供的参数格式化的字符串资源。
    /// </summary>
    /// <param name="includeParentCultures">指示是否包括来自父区域性的字符串</param>
    /// <returns></returns>
    public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures)
    {
        var culture = L.GetSelectCulture().Culture;
        var area = App.HttpContext.GetAreaName();
        var dics = LEx.GetLocalizationDics(culture.Name);
        foreach (var item in dics)
        {
            yield return new LocalizedString(item.Key, item.Value ?? item.Key, item.Value == null, "");
        }
    }
}
